#!/bin/bash

# JDK和Maven一键安装脚本
# 功能：提供菜单选项，允许用户选择安装JDK、Maven或两者
# 版本：1.0
# 作者：JDK和Maven安装脚本生成器

# 设置脚本严格模式
set -euo pipefail

# 全局变量定义
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOG_DIR="${SCRIPT_DIR}/logs"
TEMP_DIR="${SCRIPT_DIR}/temp"
CONFIG_DIR="${SCRIPT_DIR}/config"

# 安装选项
INSTALL_JDK=false
INSTALL_MAVEN=false
INTERACTIVE_MODE=true
SILENT_MODE=false
FORCE_INSTALL=false
AUTO_VERIFY=true

# 日志级别
LOG_LEVEL_DEBUG=0
LOG_LEVEL_INFO=1
LOG_LEVEL_WARN=2
LOG_LEVEL_ERROR=3
LOG_LEVEL_FATAL=4
CURRENT_LOG_LEVEL=$LOG_LEVEL_INFO

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 错误码定义
ERROR_SUCCESS=0
ERROR_GENERAL=1
ERROR_INVALID_ARGS=1001
ERROR_SCRIPT_NOT_FOUND=1002
ERROR_PERMISSION_DENIED=1003

# =============================================================================
# 工具函数
# =============================================================================

# 显示帮助信息
show_help() {
    cat << EOF
JDK和Maven一键安装脚本

用法: $0 [选项]

选项:
    -h, --help          显示此帮助信息
    -v, --version       显示脚本版本
    -j, --jdk           仅安装JDK
    -m, --maven         仅安装Maven
    -a, --all           安装JDK和Maven（默认）
    -s, --silent        静默安装模式
    -f, --force         强制安装，覆盖现有安装
    --no-verify         安装后不运行校验脚本
    --debug             启用调试模式

交互式模式选项（无参数运行时）:
    1. 安装JDK 21
    2. 安装Maven 3.9.x
    3. 安装JDK和Maven
    4. 校验现有安装
    5. 退出

示例:
    $0                  交互式安装
    $0 -a               安装JDK和Maven
    $0 -j -s            静默安装JDK
    $0 -m -f            强制安装Maven
    $0 --no-verify      安装后不校验

EOF
}

# 显示版本信息
show_version() {
    echo "JDK和Maven一键安装脚本 v1.0"
    echo "目标JDK版本: Amazon Corretto 21"
    echo "目标Maven版本: Apache Maven 3.9.x"
}

# 日志记录函数
log_message() {
    local level="$1"
    local message="$2"
    local module="${3:-MAIN}"
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    local pid=$$
    
    # 检查日志级别
    case $level in
        "DEBUG") [[ $CURRENT_LOG_LEVEL -gt $LOG_LEVEL_DEBUG ]] && return ;;
        "INFO")  [[ $CURRENT_LOG_LEVEL -gt $LOG_LEVEL_INFO ]] && return ;;
        "WARN")  [[ $CURRENT_LOG_LEVEL -gt $LOG_LEVEL_WARN ]] && return ;;
        "ERROR") [[ $CURRENT_LOG_LEVEL -gt $LOG_LEVEL_ERROR ]] && return ;;
        "FATAL") [[ $CURRENT_LOG_LEVEL -gt $LOG_LEVEL_FATAL ]] && return ;;
    esac
    
    # 格式化日志消息
    local log_entry="[${timestamp}] [${level}] [${module}] [${pid}] ${message}"
    
    # 写入日志文件
    if [[ -d "$LOG_DIR" ]]; then
        echo "$log_entry" >> "${LOG_DIR}/install_all_$(date +%Y%m%d_%H%M%S).log"
    fi
    
    # 控制台输出
    if [[ "$SILENT_MODE" != true ]]; then
        case $level in
            "DEBUG") echo -e "${BLUE}${log_entry}${NC}" ;;
            "INFO")  echo -e "${GREEN}${log_entry}${NC}" ;;
            "WARN")  echo -e "${YELLOW}${log_entry}${NC}" ;;
            "ERROR") echo -e "${RED}${log_entry}${NC}" ;;
            "FATAL") echo -e "${RED}${log_entry}${NC}" ;;
            *)       echo "$log_entry" ;;
        esac
    fi
}

# 便捷日志函数
log_debug() { log_message "DEBUG" "$1" "${2:-MAIN}"; }
log_info() { log_message "INFO" "$1" "${2:-MAIN}"; }
log_warn() { log_message "WARN" "$1" "${2:-MAIN}"; }
log_error() { log_message "ERROR" "$1" "${2:-MAIN}"; }
log_fatal() { log_message "FATAL" "$1" "${2:-MAIN}"; }

# 显示状态信息
show_status() {
    local status="$1"
    local message="$2"
    
    case $status in
        "success")
            echo -e "${GREEN}✓ ${message}${NC}"
            ;;
        "warning")
            echo -e "${YELLOW}⚠ ${message}${NC}"
            ;;
        "error")
            echo -e "${RED}✗ ${message}${NC}"
            ;;
        "info")
            echo -e "${BLUE}ℹ ${message}${NC}"
            ;;
    esac
}

# 错误处理函数
handle_error() {
    local error_code="$1"
    local error_message="$2"
    local module="${3:-MAIN}"
    
    log_error "$error_message (错误码: $error_code)" "$module"
    
    case $error_code in
        $ERROR_INVALID_ARGS)
            log_error "参数错误，请检查命令行参数" "$module"
            ;;
        $ERROR_SCRIPT_NOT_FOUND)
            log_error "找不到必要的脚本文件" "$module"
            ;;
        $ERROR_PERMISSION_DENIED)
            log_error "权限不足，请检查文件和目录权限" "$module"
            ;;
        *)
            log_error "未知错误，请查看日志获取详细信息" "$module"
            ;;
    esac
    
    exit $error_code
}

# 检查命令是否存在
command_exists() {
    command -v "$1" >/dev/null 2>&1
}

# 创建必要的目录
create_directories() {
    log_debug "创建必要的目录" "SYSTEM_INIT"
    
    local dirs=("$LOG_DIR" "$TEMP_DIR" "$CONFIG_DIR")
    
    for dir in "${dirs[@]}"; do
        if [[ ! -d "$dir" ]]; then
            mkdir -p "$dir" || {
                log_error "无法创建目录: $dir" "SYSTEM_INIT"
                return $ERROR_PERMISSION_DENIED
            }
            log_debug "已创建目录: $dir" "SYSTEM_INIT"
        fi
    done
    
    return 0
}

# 检查脚本文件是否存在
check_script_files() {
    log_debug "检查脚本文件" "SYSTEM_CHECK"
    
    local scripts=("install_jdk.sh" "install_maven.sh" "verify_installation.sh")
    local missing_scripts=()
    
    for script in "${scripts[@]}"; do
        if [[ ! -f "${SCRIPT_DIR}/${script}" ]]; then
            missing_scripts+=("$script")
        fi
    done
    
    if [[ ${#missing_scripts[@]} -gt 0 ]]; then
        log_error "缺少脚本文件: ${missing_scripts[*]}" "SYSTEM_CHECK"
        return $ERROR_SCRIPT_NOT_FOUND
    fi
    
    # 检查脚本是否可执行
    for script in "${scripts[@]}"; do
        if [[ ! -x "${SCRIPT_DIR}/${script}" ]]; then
            log_info "设置脚本执行权限: $script" "SYSTEM_CHECK"
            chmod +x "${SCRIPT_DIR}/${script}" || {
                log_error "无法设置脚本执行权限: $script" "SYSTEM_CHECK"
                return $ERROR_PERMISSION_DENIED
            }
        fi
    done
    
    log_info "所有脚本文件检查通过" "SYSTEM_CHECK"
    return 0
}

# =============================================================================
# 菜单和交互函数
# =============================================================================

# 显示主菜单
show_main_menu() {
    clear
    echo "========================================"
    echo "      JDK和Maven一键安装脚本"
    echo "========================================"
    echo
    echo "请选择要执行的操作:"
    echo
    echo "  1. 安装JDK 21"
    echo "  2. 安装Maven 3.9.x"
    echo "  3. 安装JDK和Maven"
    echo "  4. 校验现有安装"
    echo "  5. 退出"
    echo
    echo -n "请输入选项 [1-5]: "
}

# 处理菜单选择
handle_menu_choice() {
    local choice="$1"
    
    case $choice in
        1)
            INSTALL_JDK=true
            INSTALL_MAVEN=false
            log_info "用户选择: 仅安装JDK" "MENU"
            ;;
        2)
            INSTALL_JDK=false
            INSTALL_MAVEN=true
            log_info "用户选择: 仅安装Maven" "MENU"
            ;;
        3)
            INSTALL_JDK=true
            INSTALL_MAVEN=true
            log_info "用户选择: 安装JDK和Maven" "MENU"
            ;;
        4)
            INSTALL_JDK=false
            INSTALL_MAVEN=false
            AUTO_VERIFY=true
            log_info "用户选择: 校验现有安装" "MENU"
            ;;
        5)
            log_info "用户选择: 退出" "MENU"
            echo "退出安装脚本。"
            exit 0
            ;;
        *)
            show_status "error" "无效选项，请输入1-5之间的数字"
            return 1
            ;;
    esac
    
    return 0
}

# 交互式模式
interactive_mode() {
    log_info "进入交互式模式" "INTERACTIVE"
    
    while true; do
        show_main_menu
        read -r choice
        
        if handle_menu_choice "$choice"; then
            break
        else
            echo
            read -p "按回车键继续..."
        fi
    done
    
    return 0
}

# =============================================================================
# 安装函数
# =============================================================================

# 安装JDK
install_jdk() {
    if [[ "$INSTALL_JDK" != true ]]; then
        return 0
    fi
    
    log_info "开始安装JDK" "INSTALL"
    
    local jdk_script="${SCRIPT_DIR}/install_jdk.sh"
    local jdk_args=()
    
    # 构建JDK安装参数
    if [[ "$SILENT_MODE" == true ]]; then
        jdk_args+=("-s")
    fi
    
    if [[ "$FORCE_INSTALL" == true ]]; then
        jdk_args+=("-f")
    fi
    
    if [[ "$CURRENT_LOG_LEVEL" == "$LOG_LEVEL_DEBUG" ]]; then
        jdk_args+=("--debug")
    fi
    
    log_info "执行JDK安装脚本: $jdk_script ${jdk_args[*]}" "INSTALL"
    
    if ! "$jdk_script" "${jdk_args[@]}"; then
        log_error "JDK安装失败" "INSTALL"
        return 1
    fi
    
    show_status "success" "JDK安装完成"
    return 0
}

# 安装Maven
install_maven() {
    if [[ "$INSTALL_MAVEN" != true ]]; then
        return 0
    fi
    
    log_info "开始安装Maven" "INSTALL"
    
    local maven_script="${SCRIPT_DIR}/install_maven.sh"
    local maven_args=()
    
    # 构建Maven安装参数
    if [[ "$SILENT_MODE" == true ]]; then
        maven_args+=("-s")
    fi
    
    if [[ "$FORCE_INSTALL" == true ]]; then
        maven_args+=("-f")
    fi
    
    if [[ "$CURRENT_LOG_LEVEL" == "$LOG_LEVEL_DEBUG" ]]; then
        maven_args+=("--debug")
    fi
    
    log_info "执行Maven安装脚本: $maven_script ${maven_args[*]}" "INSTALL"
    
    # 使用source执行安装脚本，以便继承环境变量
    if ! source "$maven_script" "${maven_args[@]}"; then
        log_error "Maven安装失败" "INSTALL"
        return 1
    fi
    
    # 验证MAVEN_HOME是否在当前会话中设置
    if [[ -n "${MAVEN_HOME:-}" && -d "$MAVEN_HOME" ]]; then
        log_info "MAVEN_HOME已在当前会话中设置: $MAVEN_HOME" "INSTALL"
        
        # 确保M2_HOME也设置
        export M2_HOME="${MAVEN_HOME}"
        
        # 确保PATH包含Maven bin目录
        if [[ ":$PATH:" != *":$MAVEN_HOME/bin:"* ]]; then
            export PATH="$MAVEN_HOME/bin:$PATH"
            log_info "已将Maven bin目录添加到PATH" "INSTALL"
        fi
    else
        log_warn "MAVEN_HOME未在当前会话中设置，尝试从配置文件中读取" "INSTALL"
        
        # 尝试从配置文件中获取MAVEN_HOME
        local maven_home_from_config=$(grep "export MAVEN_HOME=" "$HOME/.bashrc" 2>/dev/null | tail -1 | cut -d'=' -f2 | tr -d '"')
        if [[ -n "$maven_home_from_config" && -d "$maven_home_from_config" ]]; then
            export MAVEN_HOME="$maven_home_from_config"
            export M2_HOME="$MAVEN_HOME"
            export PATH="$MAVEN_HOME/bin:$PATH"
            log_info "从配置文件中设置MAVEN_HOME: $MAVEN_HOME" "INSTALL"
        else
            log_error "无法设置MAVEN_HOME环境变量" "INSTALL"
            return 1
        fi
    fi
    
    show_status "success" "Maven安装完成"
    return 0
}

# 校验安装
verify_installation() {
    if [[ "$AUTO_VERIFY" != true ]]; then
        log_info "跳过安装校验" "VERIFY"
        return 0
    fi
    
    log_info "开始校验安装" "VERIFY"
    
    local verify_script="${SCRIPT_DIR}/verify_installation.sh"
    local verify_args=()
    
    # 构建校验参数
    if [[ "$INSTALL_JDK" == true && "$INSTALL_MAVEN" == false ]]; then
        verify_args+=("-j")  # 仅校验JDK
    elif [[ "$INSTALL_JDK" == false && "$INSTALL_MAVEN" == true ]]; then
        verify_args+=("-m")  # 仅校验Maven
    fi
    
    if [[ "$CURRENT_LOG_LEVEL" == "$LOG_LEVEL_DEBUG" ]]; then
        verify_args+=("--debug")
    fi
    
    if [[ "$SILENT_MODE" == true ]]; then
        verify_args+=("--quiet")
    fi
    
    log_info "执行校验脚本: $verify_script ${verify_args[*]}" "VERIFY"
    
    if ! "$verify_script" "${verify_args[@]}"; then
        log_warn "安装校验失败，请检查安装结果" "VERIFY"
        return 1
    fi
    
    show_status "success" "安装校验完成"
    return 0
}

# =============================================================================
# 主函数
# =============================================================================

# 解析命令行参数
parse_arguments() {
    while [[ $# -gt 0 ]]; do
        case $1 in
            -h|--help)
                show_help
                exit 0
                ;;
            -v|--version)
                show_version
                exit 0
                ;;
            -j|--jdk)
                INSTALL_JDK=true
                INTERACTIVE_MODE=false
                shift
                ;;
            -m|--maven)
                INSTALL_MAVEN=true
                INTERACTIVE_MODE=false
                shift
                ;;
            -a|--all)
                INSTALL_JDK=true
                INSTALL_MAVEN=true
                INTERACTIVE_MODE=false
                shift
                ;;
            -s|--silent)
                SILENT_MODE=true
                INTERACTIVE_MODE=false
                shift
                ;;
            -f|--force)
                FORCE_INSTALL=true
                shift
                ;;
            --no-verify)
                AUTO_VERIFY=false
                shift
                ;;
            --debug)
                CURRENT_LOG_LEVEL=$LOG_LEVEL_DEBUG
                shift
                ;;
            *)
                log_error "未知参数: $1"
                show_help
                exit $ERROR_INVALID_ARGS
                ;;
        esac
    done
    
    # 如果没有指定安装选项，默认安装全部
    if [[ "$INTERACTIVE_MODE" == false && "$INSTALL_JDK" == false && "$INSTALL_MAVEN" == false ]]; then
        INSTALL_JDK=true
        INSTALL_MAVEN=true
    fi
}

# 显示安装摘要
show_installation_summary() {
    if [[ "$SILENT_MODE" == true ]]; then
        return 0
    fi
    
    echo
    echo "========================================"
    echo "           安装摘要"
    echo "========================================"
    echo
    echo "将要执行的操作:"
    
    if [[ "$INSTALL_JDK" == true ]]; then
        echo "  ✓ 安装JDK 21 (Amazon Corretto)"
    else
        echo "  - 跳过JDK安装"
    fi
    
    if [[ "$INSTALL_MAVEN" == true ]]; then
        echo "  ✓ 安装Maven 3.9.x (Apache Maven)"
    else
        echo "  - 跳过Maven安装"
    fi
    
    if [[ "$AUTO_VERIFY" == true ]]; then
        echo "  ✓ 安装后自动校验"
    else
        echo "  - 跳过安装校验"
    fi
    
    if [[ "$FORCE_INSTALL" == true ]]; then
        echo "  ⚠ 强制安装模式（覆盖现有安装）"
    fi
    
    echo
    
    if [[ "$INTERACTIVE_MODE" == true ]]; then
        read -p "按回车键开始安装..."
    fi
}

# 主安装流程
main() {
    log_info "开始JDK和Maven安装过程" "MAIN"
    
    # 解析命令行参数
    parse_arguments "$@"
    
    # 创建必要目录
    create_directories || handle_error $? "无法创建必要目录"
    
    # 检查脚本文件
    check_script_files || handle_error $? "脚本文件检查失败"
    
    # 如果是交互式模式，显示菜单
    if [[ "$INTERACTIVE_MODE" == true ]]; then
        interactive_mode || handle_error $? "交互式模式失败"
    fi
    
    # 显示安装摘要
    show_installation_summary
    
    # 执行安装
    local install_failed=false
    
    if ! install_jdk; then
        install_failed=true
    fi
    
    if ! install_maven; then
        install_failed=true
    fi
    
    # 校验安装
    if ! verify_installation; then
        install_failed=true
    fi
    
    # 显示最终结果
    echo
    echo "========================================"
    echo "           安装完成"
    echo "========================================"
    echo
    
    if [[ "$install_failed" == true ]]; then
        show_status "error" "安装过程中出现错误，请查看日志"
        echo
        echo "建议:"
        echo "  1. 查看日志文件获取详细错误信息"
        echo "  2. 检查网络连接和磁盘空间"
        echo "  3. 重新运行脚本或使用--force参数强制安装"
        echo
        exit $ERROR_GENERAL
    else
        show_status "success" "所有操作完成"
        echo
        echo "使用说明:"
        echo "  1. 运行 'source ~/.bashrc' 使环境变量生效"
        echo "  2. 使用 'java -version' 验证JDK安装"
        echo "  3. 使用 'mvn -version' 验证Maven安装"
        echo
        echo "日志文件位置: $LOG_DIR"
        echo
    fi
    
    exit $ERROR_SUCCESS
}

# 脚本入口点
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    main "$@"
fi